﻿// owner 蒋家伟

#pragma once
#include "TaskBase_home.h"
#include "TaskId.h"

namespace jsdk
{
    class ITask;
    // 任务管理器，负责任务的存储
    class TASKBASE_EXPORT ITaskManager
    {
    public:
        /// \ brief 获取任务管理器
        static ITaskManager* get();
        virtual ~ITaskManager() {}

        /// \ brief 通过TaskId 获取已经生成的任务
        /// \ in taskId 任务Id
        /// \ return 一个打包好的任务
        virtual OwnerPtr<ITask> getTaskById(const TaskId& taskId) = 0;

        /// \ brief 向管理器中放入一个需要执行的异步任务，线程安全
        /// \ note : 异步任务的定时可能存在延迟，适用于不是那么在意时间精准的任务
        /// \ in opTask 封装好的任务对象
        /// \ return 给当前任务生成的ID
        virtual TaskId addAsyncTask(OwnerPtr<ITask> opTask) = 0;

        /// \ brief 向管理器中放入一个需要执行的同步任务，线程不安全【同步任务需要使用者保证线程同步】
        /// \ note : 由触发任务所在的线程执行，如果设置了延迟时间则会在当前触发的线程定时，尽可能的保障时间的精准
        /// \ in opTask 封装好的任务对象
        virtual void addSyncTask(OwnerPtr<ITask> opTask) = 0;

    protected:
        static ITaskManager* s_TaskManager;
    };
}

#define ADD_ASYNC_TASK(OP_TASK) \
jsdk::ITaskManager::get()->addAsyncTask(std::move(OP_TASK));

#define ADD_SYNC_TASK(OP_TASK) \
jsdk::ITaskManager::get()->addSyncTask(std::move(OP_TASK));

#define GET_ASYNC_TASK(TASK_ID) \
jsdk::ITaskManager::get()->getTaskById(TASK_ID);